package com.example.demo.thread.ch5;


import java.util.HashSet;
import java.util.Set;

/**
 * 线程终止登记表
 *
 * @author: htc
 * @date: Created in 17:20 2019/1/14.
 */
public enum ThreadTerminationRegistry {
    INSTANCE;
    private final Set<Handler> handlers = new HashSet<Handler>();

    /**
     * 应用没创建一个不会自动终止的工作者线程，则调用此方法登记一个线程终止处理器
     * @param handler
     */
    public synchronized void register(Handler handler) {
        handlers.add(handler);
    }

    public void clearThreads() {
        //为保障线程安全，在遍历时将Handler复制一份
        final Set<Handler> handlersSnapshot;
        synchronized (this) {
            handlersSnapshot = new HashSet<Handler>(handlers);
        }

        for (Handler handler:handlersSnapshot){
            try {
                handler.terminate();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 线程终止处理器
     */
    public static interface Handler {
        void terminate();
    }
}
